# 结合提示词和标题问题，对文本进行分类

# 导包
from dotenv import load_dotenv

load_dotenv()

import os
from openai import OpenAI

SYSTEAM_PROMPT = """
您是一个高性能的电商评论分析API。请严格遵循以下指令对输入的评论列表进行批量情感和品类分类。

分析要求
批量处理：您将收到一个评论列表，需要对每条评论进行独立分析

情感分析 (Sentiment)：判断每条评论的情感极性，输出英文：positive (代表好评) 或 negative (代表差评)

情感置信度 (Score)：为每条评论提供一个0.0到1.0之间的浮点数置信度

品类分类 (Tags)：预测每条评论所描述的商品类别。类别必须严格限定在以下选项：书籍, 平板, 手机, 水果, 洗发水, 热水器, 蒙牛, 衣服, 计算机, 酒店

元数据：返回指定的固定模型信息和总体统计信息

性能指标：为每条评论模拟合理的推理耗时，并计算总耗时

输出格式
你必须将结果以一个严格的JSON对象形式返回，并且只包含以下字段：

json
{
  "modelID": "deepseek",
  "modelName": "LLM模型",
  "total": 2,
  "totalTime": 235,
  "items": [
    {
      "text": "评论内容1",
      "sentiment": "positive",
      "score": 0.95,
      "tags": ["手机"],
      "inferenceTime": 120
    },
    {
      "text": "评论内容2",
      "sentiment": "negative",
      "score": 0.87,
      "tags": ["书籍"],
      "inferenceTime": 115
    }
  ]
}
字段说明：

modelID: (string) 固定返回字符串："deepseek"

modelName: (string) 固定返回字符串："LLM"

total: (number) 输入文本的数量

totalTime: (number) 处理所有文本的总耗时(ms)，应是各个inferenceTime之和

items: (array) 对象数组，每个对象包含单条评论的分析结果：

text: (string) 原始输入文本

sentiment: (string) 情感标签，值为 "positive" 或 "negative"

score: (number) 情感置信度(0.0-1.0)

tags: (array) 字符串数组，包含预测出的类别(如 ["手机"])

inferenceTime: (number) 单条推理时间(ms)，建议值1000-2000

输入文本
以下是需要分析的评论列表：

{comments_list}

请开始分析并返回符合上述格式的JSON结果（不需要markdown语法）。
"""


def get_deeepseek_res(prompt):
    client = OpenAI(api_key=os.getenv("API_KEY_DeepSeek"), base_url=os.getenv("BASE_URL_DeepSeek"))
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": SYSTEAM_PROMPT},
            {"role": "user", "content": prompt},
        ],
        stream=False
    )
    return response.choices[0].message.content


def get_zhipuai_res(prompt):
    client = OpenAI(
        api_key=os.getenv("API_KEY_GLM"),
        base_url=os.getenv("BASE_URL_GLM")
    )

    completion = client.chat.completions.create(
        model="glm-4.5",
        messages=[
            {"role": "system", "content": SYSTEAM_PROMPT},
            {"role": "user", "content": prompt}
        ],
        top_p=0.7,
        temperature=0.9
    )

    return completion.choices[0].message.content


def get_qwen_res(prompt):
    client = OpenAI(
        # 若没有配置环境变量，请用百炼API Key将下行替换为：api_key="sk-xxx",
        api_key=os.getenv("API_KEY_ALI"),
        base_url=os.getenv("BASE_URL_ALI")
    )

    completion = client.chat.completions.create(
        # 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
        model="qwen-plus",
        messages=[
            {"role": "system", "content": SYSTEAM_PROMPT},
            {"role": "user", "content": prompt},
        ],
        # Qwen3模型通过enable_thinking参数控制思考过程（开源版默认True，商业版默认False）
        # 使用Qwen3开源版模型时，若未启用流式输出，请将下行取消注释，否则会报错
        # extra_body={"enable_thinking": False},
    )
    return completion.choices[0].message.content


if __name__ == '__main__':
    # print(get_deeepseek_res("这牛奶真难喝"))
    print(get_zhipuai_res("这牛奶真难喝"))
    # print(get_qwen_res("这牛奶真难喝"))
